package modelo;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;

public class VentaDao 
{
	public boolean registrarVenta(Venta venta) throws Exception
	{
		ArrayList<String> tirasSQL= new ArrayList<String>();
		
		tirasSQL.add("insert into \"VENTAS\" (cod_venta,porc_impuesto,porc_descuento,total_pagar,fecha,cod_cliente,status) " +
				"values (" + venta.getCodigoVenta() + "," + venta.getPorcImpuesto() + "," + venta.getPorcDescuento() + "," +
				venta.getTotalPagar() + ",'" + venta.getFechaFormateada() + "','" + venta.getCliente().getCodCliente() + "','A')");
		
        Iterator<VentaDetalle> iterador= venta.getIterador();   
		VentaDetalle ventaDetalle=null;
		List<ProductoIngrediente> lista= null;
		
        while (iterador.hasNext())
        {
           ventaDetalle= iterador.next();
           
           tirasSQL.add("insert into \"VENTAS_DETALLES\" (cod_venta,cod_producto,precio_unitario,cantidad,status) values " + 
        		        "(" + venta.getCodigoVenta()  + ",'" + ventaDetalle.getProducto().getCodigo() + "'," +
        		         ventaDetalle.getProducto().getPrecioVenta() + "," + ventaDetalle.getCantidad() + ",'A')");
              
           lista= new ProductoIngredienteDao().getProductosIngredientes(ventaDetalle.getProducto());
           
           for (ProductoIngrediente productoIngrediente: lista)
           {
        	   tirasSQL.add("update \"INGREDIENTES\" set existencia= (existencia -" + productoIngrediente.getCantidad() * ventaDetalle.getCantidad() + 
        			        ") where cod_ingrediente='" + productoIngrediente.getIngrediente().getCodigo()  + "'");
           }
        }  
        
		boolean ejecutado=Conexion.ejecutarDMLTransaccion(tirasSQL);
		
		return ejecutado;
	}
	
	/*Obtiene los Productos cuya existencia de Ingredientes en el inventario
	  es suficiente para vender*/
	
	public List<Producto> getProductosFacturables() throws Exception
	{
		List<Producto> productosR= new ArrayList<Producto>();
		ProductoDao productoDao= new ProductoDao();
		List<Producto> productosA = productoDao.consultarProductosActivos();
		
		
		String tiraSQL= "select distinct(\"P\".cod_producto) " +
				 "from \"PRODUCTOS\" as \"P\",\"PRODUCTOS_INGREDIENTES\" as \"PI\"," +
				 " \"INGREDIENTES\" as \"I\" where \"P\".cod_producto=\"PI\".cod_producto" + 
				 " and \"PI\".cod_ingrediente=\"I\".cod_ingrediente and \"P\".status='A' and " + 
				 "\"I\".status='A' and \"PI\".status='A' and \"I\".existencia < \"PI\".cantidad";
		
		
		
		ResultSet rs= Conexion.ejecutarDQL(tiraSQL);
		Producto producto;
	    
		
		while (rs.next())
		{
		    producto= new Producto();
		    producto.setCodigo(rs.getString("cod_producto"));
		    productosR.add(producto);
		}
		
		if (!productosR.isEmpty())
	         productosA.removeAll(productosR);
		
		return productosA;
	}
	
	public long getNroVentas() throws Exception
	{
		long nroVentas=0;
		
		String tiraSQL= "select count(*) as \"nro_ventas\" from \"VENTAS\" ";
		ResultSet rs= Conexion.ejecutarDQL(tiraSQL);
		
		if (rs.next())
		  nroVentas= rs.getInt("nro_ventas");
		
		return nroVentas;
	}
	
	public int cantidadProductosFacturables(Producto producto) throws Exception
	{
		int cantidad=0;
		
		if (getProductosFacturables().contains(producto))
		{
			ArrayList<Integer> listaCantidadIngredientes= new ArrayList<Integer>();
			
			String tiraSQL= "select \"INGREDIENTES\".cod_ingrediente, (\"INGREDIENTES\".existencia / \"PRODUCTOS_INGREDIENTES\".cantidad)  AS \"CANTIDAD\" " +
            "from \"INGREDIENTES\",\"PRODUCTOS_INGREDIENTES\",\"PRODUCTOS\" where \"INGREDIENTES\".cod_ingrediente=\"PRODUCTOS_INGREDIENTES\".cod_ingrediente and " +
            "\"PRODUCTOS\".cod_producto=\"PRODUCTOS_INGREDIENTES\".cod_producto and \"PRODUCTOS\".status='A'  and \"PRODUCTOS_INGREDIENTES\".status='A' " + 
            "and \"INGREDIENTES\".status='A' and \"PRODUCTOS\".cod_producto='" + producto.getCodigo() + "'";
			
			ResultSet rs= Conexion.ejecutarDQL(tiraSQL);
			while (rs.next())
			{
				listaCantidadIngredientes.add((int)rs.getDouble("CANTIDAD"));
			}
			
			cantidad = java.util.Collections.min(listaCantidadIngredientes);
		}  
		
		return cantidad;
	} 

}
